11092
1600
这个问题已经在这里有了答案:
重载运算符中没有隐式转换
(2个答案)
7年前关闭。
我正在为基本类型编写一个简单的包装程序,并试图避免不得不编写太多标准操作符。我希望隐式类型转换会有所帮助,但没有帮助。这是一个简化的示例:
struct Int
{
int _i;
Int(int i = 0):_i {i} {}
Int运算符+(const Int&rhs){返回_i + rhs._i;}
};
int main(int argc,char * argv [])
{
(无效)(Int(1)+ 2); // 美好的
(无效)(2 + Int(1)); //错误:对二进制表达式无效的操作数(“ int”和“ Int”)
}
我正在使用llvm。第一行主要编译良好。第二个导致错误。现在,我希望在第二行中发生的是将2隐式转换为Int(2),然后再调用operator +。为什么不发生这种情况?为什么在第一行中发生隐式转换? 
它发生在第一行,因为唯一可用的operator +是operator +(Int&)(对于此实例,它具有隐式的Int第一参数)。第二行失败,因为第一个参数是int,并且不知道在尝试操作之前需要对其进行转换(它不知道需要使用Int :: operator +)。
您可以通过使操作员成为非成员朋友功能来避免该问题(http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int(int i = 0):_i {i} {}
朋友Int运算符+(const Int&lhs,const Int&rhs);
};
Int运算符+(const Int&lhs,const Int&rhs)
{
返回lhs._i + rhs._i;
}
int main()
{
诠释
我+ 5;
5 +我;
返回0;
}
|
不是您要找的答案?浏览标记为c ++运算符关键字隐式转换的其他问题,或者提出您自己的问题。